import pygame
from pygame.locals import *
import os, sys
from socket import *
import time

#
# Globais
#
superficie = None
raio = None
largura = None
tamanho = None
servidor = None
endereco = '127.0.0.1',8800
serv_backlog = 10
conexoes = []
recebido = ""
cor = (255,0,0)

# Cores
vermelho=(255,0,0)
azul=(0,0,255)
preto = (0,0,0)
branco = (255,255,255)
# Tamanho da grade: tgrade x tgrade
tgrade=64
# Tamanho da Janela
xtam = 640
ytam = 640

def corrija(posicao_param):
    posicao = posicao_param
    
    posicao[0]=posicao[0]*largura-(raio-1)
    posicao[1]=posicao[1]*largura-(raio-1)
    return posicao

def linha(inicio, fim, cor):
    pass;

def ponto(posicao, cor):
    global superficie
    pygame.draw.circle(superficie, cor, posicao,raio-1)
    print "Ponto: %s Cor: %s" % (posicao,cor)
    #superficie.set_at(posicao, (0,0,0,0))
    pygame.display.update()
    

def coordenadas(dimensao):
    pass;    

def grade(dimensao):
    global largura, raio, tgrade
    largura = tamanho[0] / dimensao
    raio = largura / 2
    tgrade = dimensao
    for pedaco in range(dimensao):
        pygame.draw.line(superficie, azul, (pedaco*largura,0), (pedaco*largura,tamanho[1]))
        pygame.draw.line(superficie, azul, (0, pedaco*largura), (tamanho[1], pedaco*largura))
    pygame.display.update()

def inicialize():
    global superficie
    global raio
    global largura
    global tamanho
    pygame.init()
    info = pygame.display.Info()
    pygame.display.set_mode((xtam, ytam),0,16)
    superficie = pygame.display.get_surface()
    tamanho = superficie.get_size()
    #largura = tamanho[0] / tgrade
    #raio = largura / 2
    print "Tamanho = %s Largura = %s Raio = %s" % (tamanho, largura,raio)
    #pygame.font.init()
    #fonte = pygame.font.Font(None, 25)
    #texto = fonte.render("Alow!", 1,(0,0,255,0))
    #superficie.blit(texto, (100,10))
    
def inicialize_servidor():
    global servidor
    servidor = socket(AF_INET, SOCK_STREAM)
    servidor.bind(endereco)
    servidor.setblocking(0)
    servidor.listen(serv_backlog)

def processa_comando(comando, parametros):
    global cor
    if comando == "PO":
            parametros[0]=int(parametros[0])
            parametros[1]=int(parametros[1])
            ponto(corrija(parametros), cor)
    if comando == "PC":
            parametros[0]=int(parametros[0])
            parametros[1]=int(parametros[1])
            ponto(corrija([parametros[0],parametros[1]]), parametros[2])
    if comando == "CL":
            superficie.fill(preto)
            tgrade = int(parametros[0])
            grade(tgrade)
    if comando == "CO":
            cor = (int(parametros[0]),int(parametros[1]),int(parametros[2]))
            print cor
            

        

def verifica_dados():
    global conexoes
    global recebido
    try:    
        for cc in conexoes:
            n=cc[0].recv(1024)
            if len(n)>0:
                recebido+=n
                print "Recebi: %s" % n
                #aqui!!!
                while 1:
                    c=recebido.find('\n')
                    if(c!=-1):
                        linha=recebido[:c]
                        print "c=%d linha=%s" % (c,linha)
                        comando=linha[0:2]
                        parametros=linha[3:].split(",")
                        print "Comando: %s Parametro: %s" % (comando, parametros)
                        processa_comando(comando, parametros)
                        recebido=recebido[c+1:]
                        print "tamanho do recebido: %d recebido: %s" % (len(recebido), recebido)
                    else:
                        break
    except error, (numero, descricao):
        #print numero, descricao
        pass

def verifica_conexoes():
    global conexoes
    try:
        q,v = servidor.accept()
        print "Accept OK!"
        conexoes+=[[q,v]]
        print conexoes
    except:
        q = None


# Programa Principal

inicialize()
inicialize_servidor()
#for x in range(tgrade):
#    ponto(corrija([x+1,x+1]),vermelho)
grade(tgrade)
try:
    while 1:
        #e = pygame.event.wait()
        e = pygame.event.peek()
        if e:
            e=pygame.event.poll()
            if e.type == MOUSEBUTTONDOWN:
                print conexoes
            elif e.type == KEYDOWN and e.key == K_s:
                pygame.image.save(screen, name+'.bmp')
            elif e.type == QUIT: raise SystemExit
        verifica_conexoes()
        if len(conexoes)>0:
            verifica_dados()
        time.sleep(0.1)
finally:
   pygame.display.quit()
